package com.ymy.thinking.in.spring.dependency.lookup;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;

/**
 * 如果 Bean 存在/不存在 的时候, 依赖查找
 *
 * @author Ringo
 * @date 2021/9/1 21:14
 */
public class ObjectProviderIfAvailableDemo {

    public static void main(String[] args) {
        // 创建 IoC 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 注册当前类到 IoC 容器
        applicationContext.register(ObjectProviderIfAvailableDemo.class);
        // 开启 Spring 应用上下文
        applicationContext.refresh();

        // 依赖查找
        lookupIfAvailable(applicationContext);
        System.out.println("=======================");
        lookupByStream(applicationContext);

        // 关闭 Spring 应用上lose();
    }

    // Stream 流式查找
    private static void lookupByStream(ApplicationContext applicationContext) {
        ObjectProvider<String> objectProvider = applicationContext.getBeanProvider(String.class);
        // Stream 方式
        objectProvider.stream().forEach(System.out::println);
        // 迭代器方式
        objectProvider.iterator().forEachRemaining(System.out::println);
    }

    // IfAvailable 的方式查找
    private static void lookupIfAvailable(ApplicationContext applicationContext) {
        ObjectProvider<String> objectProvider = applicationContext.getBeanProvider(String.class);
        // 如果容器中有 Bean 就获取, 没有就返回 null
        String beanIfAvailable = objectProvider.getIfAvailable();
        // 如果容器中有 Bean 就获取, 没有就返回指定的值
        String ifAvailable = objectProvider.getIfAvailable(() -> "aabb");
        System.out.println(beanIfAvailable);
        System.out.println(ifAvailable);
    }

    @Bean
    @Primary
    public String fine() {
        return "fine";
    }

    @Bean
    public String message() {
        return "message";
    }
}
